package com.gjh.xiaokabang2code.timedtask;
import com.gjh.xiaokabang2code.common.BusinessException;
import com.gjh.xiaokabang2code.mapper.BankcardMapper;
import com.gjh.xiaokabang2code.mapper.SearchFinderMapper;
import com.gjh.xiaokabang2code.mapper.SuccessMatchMapper;
import com.gjh.xiaokabang2code.model.SearchFinder;
import com.gjh.xiaokabang2code.model.SuccessMatch;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import org.springframework.retry.annotation.Retryable;

import javax.annotation.Resource;
import java.time.LocalDateTime;
import java.util.List;
import java.util.stream.Collectors;

import static jdk.nashorn.internal.runtime.regexp.joni.Config.log;

@Component
public class UpdateSuccessMatch {
    @Resource
    private SuccessMatchMapper successMatchMapper;

    @Resource
    private BankcardMapper bankcardMapper;

    @Resource
    private SearchFinderMapper searchFinderMapper;

    @Retryable(maxAttempts = 2) // 最多重试两次
    @Scheduled(cron = "0 0 3 * * ?")
    // 每天晚上3点执行一次

    // 写一个方法：用于更新 success_match 表中的 success_status 字段，要求是三天前的数据，success_status 是 0 的数据，更新为 1
    public void updateSuccessMatch() {
        try {
            log.println("开始执行定时任务：更新 success_match 表中的 success_status 字段");
            LocalDateTime thresholdTime = LocalDateTime.now().minusSeconds(3);
            List<SuccessMatch> successMatchList = successMatchMapper.findRecordsBeforeThreshold(thresholdTime);

            if (!successMatchList.isEmpty()) {
                // 批量更新 SuccessMatch 表
                successMatchMapper.batchUpdateSuccessStatus(successMatchList);
                log.println("定时任务执行完毕：更新 success_match 表中的 success_status 字段");

                // 提取 loser_id 集合
                List<String> loserIds = successMatchList.stream()
                        .map(SuccessMatch::getLoserUid)
                        .collect(Collectors.toList());

                // 批量更新 Bankcard 表
                if (!loserIds.isEmpty()) {
                    bankcardMapper.batchUpdateBankcardStatus(loserIds);
                    log.println("定时任务执行完毕：更新 bankcard 表中的 bankcard_status 字段");
                }
            }
        } catch (BusinessException e) {
            // 记录日志或其他处理
            log.println("定时任务执行失败：更新 success_match 表中的 success_status 字段");
            throw e;
        }
    }

    @Retryable(maxAttempts = 2) // 最多重试两次
    //每天晚上2点执行一次
    @Scheduled(cron = "0 0 2 * * ?")
    //写一个方法，用于更新search_finder中的status字段，要求是十五天前的数据，status是0的数据，更新为1
    public void updateSearchFinder() {
        try {
            log.println("开始执行定时任务：更新 search_finder 表中的 status 字段");
            LocalDateTime thresholdTime = LocalDateTime.now().minusSeconds(15);
            List<SearchFinder> searchFinderList = searchFinderMapper.findRecordsBeforeThreshold(thresholdTime);

            if (!searchFinderList.isEmpty()) {
                // 批量更新 SearchFinder 表
                searchFinderMapper.batchUpdateStatus(searchFinderList);
                // 批量更新 Bankcard 表中的 bankcard_status 字段，status是1的数据，更新为0
                List<String> loserIds = searchFinderList.stream()
                        .map(SearchFinder::getLoserUid)
                        .collect(Collectors.toList());
                // 在没有异常的情况下继续执行批量更新 Bankcard 表的操作
                try {
                    bankcardMapper.batchUpdateBankcardStatus(loserIds);
                    log.println("定时任务执行完毕：更新 Bankcard 表中的 bankcard_status 字段");
                } catch (BusinessException bankcardException) {
                    // 处理 Bankcard 表更新异常，可以记录日志或其他操作
                    log.println("批量更新 Bankcard 表中的 bankcard_status 字段失败");
                    throw bankcardException; // 根据需要抛出异常或进行其他处理
                }
            }
        } catch (BusinessException e) {
            //记录日志或其他处理
            log.println("定时任务执行失败：更新 search_finder 表中的 status 字段");
            throw e;
        }
    }


}